package BD;
/*atual*/
import java.sql.*;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;//

public class produtos extends bd {
/*id_produtos, descricao, custo, qtdatual, unidade, volume*/
    private int id_produtos  = 0   ;
    public float custo       = 0   ;
    public int qtdatual      = 0   ;
    private String unidade   = ""  ;
    private String  volume   = ""  ;
    private String descricao = ""  ;        
    private boolean ingrediente = false;
    public boolean pesp_ingredi = false;
    /*String sql;
    Statement stmt;
    ResultSet rs;*/

    public boolean isIngrediente() {
        return ingrediente;
    }

    public void setIngrediente(boolean ingrediente) {
        this.ingrediente = ingrediente;
    }

    public int getId_produtos() {
        return id_produtos;
    }

    public void setId_produtos(int id_produtos) {
        this.id_produtos = id_produtos;
    }

    public float getCusto() {
        return custo;
    }

    public void setCusto(float custo) {
        this.custo = custo;
    }

    public int getQtdatual() {
        return qtdatual;
    }

    public void setQtdatual(int qtdatual) {
        this.qtdatual = qtdatual;
    }

    public String getUnidade() {
        return unidade;
    }

    public void setUnidade(String unidade) {
        this.unidade = unidade;
    }

    public String getVolume() {
        return volume;
    }

    public void setVolume(String volume) {
        this.volume = volume;
    }

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }    
    public boolean incluir() {

            
        try {
            if (!estaConectado()) 
                conecta();          
            stmt = getConexao().createStatement();          
            sql = "INSERT INTO PRODUTOS VALUES ((select coalesce(max(id_produtos)+1,1) from produtos),"
                    +"'"+this.getDescricao()+"',"
                    +"'"+ Float.toString(this.getCusto())+"',"
                    +"'"+ Integer.toString(this.getQtdatual())+ "', "
                    +"'"+ this.getUnidade()+ "', "
                    +"'"+ this.getVolume()+ "',"
                    +"'"+ Boolean.toString(this.ingrediente)+ "');";
                    
                    
            stmt.executeUpdate(sql);
            stmt.close();
            //System.out.print(this.sql);
            return true;
            
        } catch (SQLException objErro) {
            JOptionPane.showMessageDialog(null, "Não foi possível executar a Query \n" + objErro.getMessage());
            return false;
        }
    }

    public boolean alterar() {
        try {
            if (!estaConectado()) 
                conecta();          

            stmt = getConexao().createStatement();          
            sql = "UPDATE produtos "+
                  "SET descricao='"+ this.getDescricao() + "', "+
                  "custo='"+ Float.toString(this.getCusto())+ "', "+
                  "qtdatual='"+ Integer.toString(this.getQtdatual())+ "', "+
                  "unidade='"+ this.getUnidade()+ "', "+
                  "volume='" + this.getVolume()+ "',  "+
                  "ingrediente='" + Boolean.toString(this.ingrediente)+ "'  "+
                  " WHERE id_produtos='"+ Integer.toString(this.getId_produtos())+"';";
                   
            stmt.executeUpdate(sql);
            stmt.close();
            //System.out.print(this.sql);
            return true;
        } catch (SQLException objErro) {
            JOptionPane.showMessageDialog(null, "Não foi possível executar a Query \n" + objErro.getMessage());
            return false;
        }

    }

    public ResultSet consultar() {
        if (!estaConectado()) {
            conecta();
        }
        try {
            stmt = getConexao().createStatement();
            sql = "SELECT *"
                    + "FROM produtos  "
                    + "WHERE 1=1 ";
            
            if (! this.descricao.equals("") ){
                sql = sql + " AND descricao like  '%"+this.getDescricao()+"%'";
            }
            if (this.id_produtos > 0){
                sql = sql + " AND id_produtos = '"+Integer.toString(this.getId_produtos())+"'";
            }
            if(this.pesp_ingredi)    
                sql = sql + " and ingrediente='"+Boolean.toString(this.ingrediente)+"'";
            
            
            rs = stmt.executeQuery(sql);
            return rs;
            
        } catch (SQLException objErro) {
            JOptionPane.showMessageDialog(null, "Não foi possível executar a Query \n" + objErro.getMessage());
            return null;
        }
        
    }
    public ArrayList<produtos> getItens(){
        ArrayList itens = new ArrayList();
        rs = this.consultar();
        try{
            while(rs.next()){
                produtos    obj = new produtos();
                obj.setId_produtos(rs.getInt("id_produtos"));
                obj.setDescricao(rs.getString("descricao"));
                obj.setCusto(rs.getFloat("custo"));
                obj.setQtdatual(rs.getInt("qtdatual"));
                obj.setUnidade(rs.getString("unidade"));
                obj.setVolume(rs.getString("volume"));               
                obj.setIngrediente(rs.getBoolean("ingrediente"));

                itens.add(obj);
            }
            stmt.close();
            disconecta();
        }
        catch(SQLException erro){
            msgErro = erro.getMessage();            
        }        
        return itens;
    }
    
    public boolean excluir() {
        if (!estaConectado()) {
            conecta();
        }        
        try {
            stmt = getConexao().createStatement();                      
            sql ="DELETE FROM produtos "+                  
                 "WHERE id_produtos = "+ Integer.toString(this.id_produtos);            
            stmt.execute(sql);                        
            return  true;
        } catch (SQLException objErro) {
            JOptionPane.showMessageDialog(null, "Não foi possível  a Query \n" + objErro.getMessage());
            return false;
        }      

    } 
    /*REGRA DE NEGOCIO*/
    public boolean alterarQuandidade(Integer pQtd){
        if (!estaConectado()) {
            conecta();
        }        
        try {
            stmt = getConexao().createStatement();                      
            sql = "UPDATE produtos  SET qtdatual= qtdatual + "+Float.toString(pQtd)+
                  "WHERE id_produtos = "+ Integer.toString(this.id_produtos);            
            boolean d = stmt.execute(sql);            
            return  d;
        } catch (SQLException objErro) {
            JOptionPane.showMessageDialog(null, "Não foi possível  a Query \n" + objErro.getMessage());
            return false;
        }      
        
    }
    public boolean ReprocessaSaldoProdutos(){
        if (!estaConectado()) {
            conecta();
        }        
        try {
            stmt = getConexao().createStatement();                      
             sql =
" update produtos  set qtdatual=	("+
" coalesce((select sum(compras.qtd) from compras  where compras.id_produto=produtos.id_produtos),0) - "+
" coalesce(("+
"	select sum(sabores_itens.qtd) from sabores_itens"+
"	inner join sabores on (sabores.id_sabores = sabores_itens.id_sabores)"+
"	inner join pizzas on(pizzas.id_sabores=sabores.id_sabores)	"+
"	inner join pedidos_itens on(pedidos_itens.id_pizzas=pizzas.id_pizzas)"+
"	inner join pedidos on(pedidos.id_pedidos=pedidos_itens.id_pedidos and pedidos.situacao='F' and pedidos.finalizado=true)	"+
"	where sabores_itens.id_produtos=produtos.id_produtos"+
"	),0) -"+
" coalesce(("+
"	select count(*) from pedidos_itens	"+
"	inner join pedidos on(pedidos.id_pedidos=pedidos_itens.id_pedidos and pedidos.situacao='F' and pedidos.finalizado=true)	"+
"	where pedidos_itens.id_produtos=produtos.id_produtos"+
"	),0)"+
"	)";
	
            stmt.execute(sql);            
            return  true;
        } catch (SQLException objErro) {
            JOptionPane.showMessageDialog(null, "Não foi possível  a Query ReprocessaSaldo\n" + objErro.getMessage());
            return false;
        }      
    
    }

    public boolean ChecaMovimentacao(){
        if (!estaConectado()) {
            conecta();
        }        
        try {
            stmt = getConexao().createStatement();                      
             sql =        
                " select distinct 'cp' as tipo ,id_produto  as id_produtos from compras "+
                " where id_produto = :produtos"+
                " union all"+
                " select distinct 'sb' as tipo ,id_produtos from sabores_itens "+
                " where id_produtos =:produtos"+
                " union all"+    
                " select distinct 'pd' as tipo ,id_produtos from pedidos_itens "+
                " where id_produtos =:produtos    ";
             
            sql = sql.replace(":produtos",Integer.toString(this.getId_produtos()));
            //JOptionPane.showMessageDialog(null,sql);
            //stmt.execute(sql);            
            
            return (!stmt.executeQuery(sql).next());
            //return  true;
        } catch (SQLException objErro) {
            JOptionPane.showMessageDialog(null, "Não foi possível  a Query Checar Movimentação do produto\n" + objErro.getMessage());
            return false;
        }      
                     
    }
    public static void main(String []args){
         //ArrayList<produtos> listped = new ArrayList<produtos>();
         produtos pd = new produtos();
         pd.ReprocessaSaldoProdutos();
         /*pd.setId_produtos(1);
         System.out.println(pd.ChecaMovimentacao());*/
         
    }     
//         ped.setMesa(1);
    
    
    
}